package com.test.dao.hibernate;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * 底层DAO. <br>
 * 底层DAO.
 * <p>
 * Copyright: Copyright (c) Nov 24, 2010 6:06:47 PM
 * <p>
 * Company: 北京宽连十方数字技术有限公司
 * <p>
 * 
 * @author suncg@c-platform.com
 * @version 1.0.0
 */
@SuppressWarnings("unchecked")
public class BaseDAO<T, PK extends Serializable> extends HibernateDaoSupport {

	protected final Log log = LogFactory.getLog(getClass());

	protected Class<T> clazz = null;

	protected String className = null;

	protected BaseDAO() {
		clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
		className = clazz.getSimpleName();
	}

	/**
	 * 根据主键删除实体ͨ�����ɾ�����
	 * 
	 * @param id
	 *            主键 ���
	 */
	public void delete(PK id) {

		T t = (T) getHibernateTemplate().get(clazz, id);
		delete(t);
	}

	/**
	 * 删除实体
	 * 
	 * @param t
	 *            实体
	 */
	public void delete(T t) {
		getHibernateTemplate().delete(t);
	}

	/**
	 * 更新或者修改实体
	 * 
	 * @param t
	 *            实体
	 */
	public void saveOrUpdate(T t) {
		getHibernateTemplate().saveOrUpdate(t);
	}

	/**
	 * 通过主键获取实体
	 * 
	 * @param id
	 *            主键
	 * @return
	 */
	public T getObject(PK id) {
		T t = (T) getHibernateTemplate().get(clazz, id);
		return t;
	}

	/**
	 * 通过hql语句进行查询
	 * 
	 * @param hql
	 *            语句
	 * @return
	 */
	public List<T> list(final String hql) {
		List<T> list = getHibernateTemplate().find(hql);
		if (list != null && list.size() > 0)
			return list;
		return new ArrayList<T>();
	}

	/**
	 * 获取所有
	 * 
	 * @return
	 */
	public List<T> list() {
		return getHibernateTemplate().loadAll(clazz);
	}

	public List<T> listPage(final String hql, int offset, int size) {
		/*
		 * Session session = factory.openSession() ; Query query =
		 * session.createQuery(hql); query.setFirstResult(offset);
		 * query.setMaxResults(size); List<T> list = query.list(); if(list !=
		 * null && list.size() > 0) return list ;
		 */
		return new ArrayList<T>();
	}

}
